package com.young4j.xinsuiwutuobang.util;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;

import com.young4j.xinsuiwutuobang.annotation.Controller;
import com.young4j.xinsuiwutuobang.annotation.Service;

/**
 * 类操作助手类
 * 
 * 由于在young.properties配置文件中指定了young.framework.app.base_package,它是
 * 整个应用的基础包名，通过ClassUtil加载的类都需要基于该基础包名。所以有必要提供一个ClassHelper
 * 助手类，让他分别获取应用包名下的所有类，应用包名下所有service类，应用包名下所有Controller类。
 * 此外，我们可以将带有Controller注解与Service注解的类所产生的对象，理解为有young框架所管理的bean
 * ，所以有必要在ClassHelper类中增加一个获取应用包名下所有bean类测方法
 * @author Administrator
 *
 */
public final class ClassHelper {
	/**
	 * 用于存放所加载的类
	 */
	private static final Set<Class<?>> CLASS_SET;
	static{
		String basePackage = ConfigUtils.getAppBasePackage();
		CLASS_SET = ClassUtils.getClassSet(basePackage);
	}
	/**
	 * 获取应用包名下所有类
	 * @return
	 */
	public static Set<Class<?>> getClassSet(){
		return CLASS_SET;
	}
	/**
	 * 获取应用包名下所有Service类
	 * 
	 * @return
	 */
	public static Set<Class<?>> getServiceClassSet(){
		Set<Class<?>> classSet = new HashSet<Class<?>>();
		for(Class<?> cls : CLASS_SET){
			if(cls.isAnnotationPresent(Service.class)){
				classSet.add(cls);
			}
		}
		return classSet;
	}
	/**
	 * 获取应用包名下所有Controller类
	 * isAnnotationPresent(?.class)如果某类出现？注解则返回true
	 * 否者返回false
	 * @return
	 */
	public static Set<Class<?>> getControllerClassSet(){
		Set<Class<?>> classSet = new HashSet<Class<?>>();
		for(Class<?> cls : CLASS_SET){
			if(cls.isAnnotationPresent(Controller.class)){
				classSet.add(cls);
			}
		}
		return classSet;
	}
	/**
	 * 获取应用包名下所有bean类包括Controller和Service等
	 * @return
	 */
	public static Set<Class<?>> getBeanClassSet(){
		Set<Class<?>> beanClassSet = new HashSet<Class<?>>();
		beanClassSet.addAll(getServiceClassSet());
		beanClassSet.addAll(getControllerClassSet());
		return beanClassSet;
	}
}
